import axios from 'axios'
import { ElMessage, ElLoading } from 'element-plus'

// 创建axios实例
const service = axios.create({
  baseURL: localStorage.server || import.meta.env.VITE_APP_API, // 从环境变量获取基础URL
  // timeout: 10000, // 请求超时时间
  // headers: {
  //   'Content-Type': 'application/json;charset=UTF-8',
  // },
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么
    // const token = getToken()
    // if (token) {
    //   config.headers['Authorization'] = `Bearer ${token}`
    // }

    // 如果是GET请求，添加时间戳防止缓存
    // if (config.method === 'get') {
    //   config.params = {
    //     ...config.params,
    //     _t: Date.now(),
    //   }
    // }

    return {
      showError: true,
      ...config,
    }
  },
  error => {
    // 对请求错误做些什么
    return Promise.reject(error)
  },
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    const { data, status } = response
    const { config } = response

    console.log('config.showError', config.showError)

    console.log('config', config)

    if (status == 200) {
      // 如果是文件流直接成功返回
      if (data instanceof Blob) {
        return data
      }

      const { code, Code } = data

      if (Code == 0 || code == 0) {
        return data.data
      } else if (Code != undefined || code != undefined) {
        if (config.showError) ElMessage.error(data.Message || data.msg || 'Error')
        return Promise.reject(new Error(data.Message || data.msg || 'Error'))
      } else {
        return data
      }
    } else {
      return Promise.reject(new Error(data.message || 'Error'))
    }
  },
  error => {
    // 对响应错误做点什么
    let errMessage = '请求失败'

    if (error.response) {
      // 有响应但状态码不在2xx范围内
      switch (error.response.status) {
        case 400:
          errMessage = '请求参数错误'
          break
        case 401:
          errMessage = '未授权，请重新登录'
          removeToken()
          window.location.href = '/login'
          break
        case 403:
          errMessage = '拒绝访问'
          break
        case 404:
          errMessage = '请求资源未找到'
          break
        case 500:
          errMessage = '服务器内部错误'
          break
        case 502:
          errMessage = '网关错误'
          break
        case 503:
          errMessage = '服务不可用'
          break
        case 504:
          errMessage = '网关超时'
          break
        default:
          errMessage = `连接错误 ${error.response.status}`
      }
    } else if (error.request) {
      // 请求已发出但没有收到响应
      if (error.message.includes('timeout')) {
        errMessage = '请求超时，请检查网络'
      } else {
        errMessage = '网络异常，请检查网络连接'
      }
    } else {
      // 发送请求时出了点问题
      errMessage = error.message
    }

    message.error(errMessage)
    return Promise.reject(error)
  },
)

/**
 * 封装get方法
 * @param url 请求地址
 * @param params 请求参数
 * @param config 其他axios配置
 */
export function get(url, params = {}, config = {}) {
  return service({
    method: 'get',
    url,
    params,
    ...config,
  })
}

/**
 * 封装post方法
 * @param url 请求地址
 * @param data 请求体数据
 * @param config 其他axios配置
 */
export function post(url, data = {}, config = {}) {
  return service({
    method: 'post',
    url,
    data,
    ...config,
  })
}

/**
 * 封装put方法
 * @param url 请求地址
 * @param data 请求体数据
 * @param config 其他axios配置
 */
export function put(url, data = {}, config = {}) {
  return service({
    method: 'put',
    url,
    data,
    ...config,
  })
}

/**
 * 封装delete方法
 * @param url 请求地址
 * @param params 请求参数
 * @param config 其他axios配置
 */
export function del(url, params = {}, config = {}) {
  return service({
    method: 'delete',
    url,
    params,
    ...config,
  })
}

/**
 * 封装文件上传方法
 * @param url 请求地址
 * @param file 文件对象
 * @param data 其他表单数据
 * @param config 其他axios配置
 */
export function upload(url, file, data = {}, config = {}) {
  const formData = new FormData()
  formData.append('file', file)

  Object.keys(data).forEach(key => {
    formData.append(key, data[key])
  })

  return service({
    method: 'post',
    url,
    data: formData,
    headers: {
      'Content-Type': 'multipart/form-data',
    },
    ...config,
  })
}

export default service
